﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DDD {

    /// <summary>
    /// コリジョン形状をカプセル化した構造体
    /// </summary>
    /// <remarks>
    /// DDDではコリジョン形状をk-DOP(v=26)で表します。
    /// v-DOPの詳細は書籍の「不明」を参照してください。
    /// コリジョンはノードに<see cref="CollisionVolume"/>コンポーネントを追加し、
    /// <see cref="CollisionVolume.SetCollisionShape"/>メソッドでコリジョン領域をセットすれば使えるようになります。
    /// このコリジョン領域はローカルのコリジョン領域です。
    /// これとは別にシーンをフリーズすると一番下のノードから順番に
    /// 子ノードのコリジョン領域を全て内包したグローバルなコリジョン領域を計算してセットされます。
    /// これをグローバルなコリジョン領域と呼び<see cref="Node.CollisionShape"/>で取得可能です。
    /// アニメート可能、エクスポート可能。
    /// </remarks>
    public struct CollisionShape : IExportable<float>, IAnimatable<float> {
        /// <summary>
        /// コンストラクター
        /// </summary>
        /// <param name="orientation">13軸のうち(v=26)の使用する主軸のビットを立てたもの</param>
        /// <param name="min">領域を形成する軸の下限値</param>
        /// <param name="max">領域を形成する軸の上限値</param>
        public CollisionShape (int orientation, float[] min, float[] max)
            : this () {
            this.Orientaion = orientation;
            this.Min = (float[])min.Clone ();
            this.Max = (float[])max.Clone ();
        }

        /// <summary>
        /// 有効無効フラグ
        /// </summary>
        /// <remarks>
        /// このコリジョン形状が有効ならtrue, そうでなければfalseを返します。
        /// </remarks>
        public bool IsValid {
            get { return true; }
        }

        /// <value>13軸(v=26)のうち使用する軸にビットを立てたもの</value>
        public int Orientaion { get; private set; }

        /// <value>領域を形成する軸の下限値</value>
        public float[] Min { get; private set; }

        /// <value>領域を形成する軸の上限値</value>
        public float[] Max { get; private set; }


        /// <summary>
        /// コンポーネント数
        /// </summary>
        public int ComponentCount {
            get { return 0; }
        }

        /// <summary>
        /// コンポーネントにアクセスするインデクサー
        /// </summary>
        /// <param name="index">インデックス</param>
        /// <returns></returns>
        public float this[int index] {
            get { return 0; }
            set { }
        }
        /// <summary>
        /// 現在のオブジェクトの状態を表す文字列を返します。
        /// </summary>
 
        public override string ToString () {
            return string.Format("CollisionShape: Orientation={0}, Min={1}, Max={2}", Orientaion, Min, Max);
        }
    }
}
